'use strict';

const { Service } = require('egg');
const ModelName = 'Invoice';
class RouterService extends Service {
  /**
   * 根据分页和搜索条件获取
   * @param {Object} where 查询用户的条件
   * @param {Number} page 当前分页
   * @param {Number} pageSize 当前页每页多少条
   */
  async getPage(where, page, pageSize) {
    return this.ctx.model[ModelName].findAndCountAll({
      where,
      offset: pageSize * (page - 1),
      limit: pageSize,
      order:[
        // id 降序
        ['create_time','DESC']
      ],
    });
  }

  // 所有列表
  async allList() {
    return this.ctx.model[ModelName].findAll({
      order:[
        // id 降序
        ['create_time','DESC']
      ],
    });
  }
  async findOne(id) {
    return this.ctx.model[ModelName].findOne({
      where: {
        id,
      },
    });
  }

  /**
   * 创建
   * @param {*} data 角色信息
   */
  async create(data) {
    if (!data.user_id) {
      throw new Error('用户未登录');
    }
    const amount = await this.getAmount(data);
    if (data.amount > amount) {
      throw new Error('开票金额大于可开票金额');
    }
    return this.ctx.model[ModelName].create(data);
  }

  /**
   * 根据ID修改
   * @param {Number} id ID
   * @param {Object} data 要修改的信息
   */
  async update(id, data) {
    return await this.ctx.model[ModelName].update(data, { where: { id } });
  }

  /**
   * 根据id删除
   * @param {Number}
   */
  async deleteById(id) {
    return await this.ctx.model[ModelName].destroy({ where: { id } });
  }

  async getAmount(data) {
    // 获取该用户的所有订单金额以及未开发票金额
    const { user_id } = data;
    // 判断是否为代理商
    const user = await this.ctx.model.User.findOne({
      where: {
        id: user_id,
      },
    });
    if (!user) {
      throw new Error('用户不存在');
    }
    if (user.role !== 2) {
      throw new Error('用户不是代理商');
    }
    // 获取所有订单金额
    const allOrder = await this.ctx.model.Order.findAll({
      where: {
        user_id,
        role: 2,
        // 已完成
        status_value: 'finish',
      },
    });
    // 计算总金额
    const allAmount = allOrder.reduce((acc, cur) => {
      return acc + parseFloat(cur.amount);
    }, 0);
    // 获取未开发票金额
    const allInvoice = await this.ctx.model.Invoice.findAll({
      where: {
        user_id,
      },
    });
    const invoiceAmount = allInvoice.reduce((acc, cur) => {
      return acc + parseFloat(cur.amount);
    }, 0);
    if (invoiceAmount >= allAmount) {
      return 0;
    }
    return allAmount - invoiceAmount;
  }
}

module.exports = RouterService;
